package model;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
public class Kunde implements IEntity
{
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private long id;
	protected String vorname;
	private String nachname;
	private String rechnungsadresse;
	private String firmenname;
	private String notiz;
	private double rabat;
	private String telefon;
	private String email;
	private String web;
	private String fax;
	@Temporal(TemporalType.TIMESTAMP)
	private Date geburtstag;
	@ManyToMany(mappedBy = "kunden", cascade = CascadeType.ALL)
	private List<Belegung> belegungen = new ArrayList<Belegung>();

	public Kunde()
	{

	}

	public Kunde(String vorname, String nachname, String rechnungsadresse, String firmenname, String notiz, double rabat, String telefon, String email,
			String web, String fax, Date geburtstag, List<Belegung> belegungen)
	{
		super();
		this.vorname = vorname;
		this.nachname = nachname;
		this.rechnungsadresse = rechnungsadresse;
		this.firmenname = firmenname;
		this.notiz = notiz;
		this.rabat = rabat;
		this.telefon = telefon;
		this.email = email;
		this.web = web;
		this.fax = fax;
		this.geburtstag = geburtstag;
		this.belegungen = belegungen;
	}
	
	public Kunde(String vorname, String nachname, double rabat, Date geburtstag)
	{
		super();
		this.vorname = vorname;
		this.nachname = nachname;
		this.rabat = rabat;
		this.geburtstag = geburtstag;
	}

	// ##################################################################
	// ======================== Business Logic ==========================

	public void addBelegung(Belegung b)
	{
		this.belegungen.add(b);
		b.addKunde(this);
	}

	public static int[] getNumerOfAdultsAndChildren(List<Kunde> customers){
		int children = 0;
		int adults = 0;
		
		Calendar compareDate;
		//Decide how many children vs adults there are among the customers
		for(Kunde customer : customers){
			Calendar birthday = Calendar.getInstance();
			birthday.setTime(customer.getGeburtstag());
			compareDate = Calendar.getInstance();
			compareDate.set(Calendar.YEAR, 
					Calendar.getInstance().get(Calendar.YEAR) -Constants.childUpTo);
			if(birthday.before(compareDate)){
				children++;
			}else{
				adults++;
			}
		}
		int[] result = {adults,children};
		return result;
	}
	
	public boolean isChild()
	{
		Calendar compareDate;
		Calendar birthday = Calendar.getInstance();
		birthday.setTime(this.geburtstag);
		compareDate = Calendar.getInstance();
		compareDate.set(Calendar.YEAR, 
				Calendar.getInstance().get(Calendar.YEAR) -Constants.childUpTo);
		return (! (birthday.before(compareDate)));
	}
	
	public boolean isAdult()
	{
		return !this.isChild();
	}

	// ##################################################################
	// ================== Setters and getters start =====================

	public List<Belegung> getBelegungen()
	{
		return belegungen;
	}

	public String getVorname()
	{
		return vorname;
	}

	public void setVorname(String vorname)
	{
		this.vorname = vorname;
	}

	public String getNachname()
	{
		return nachname;
	}

	public void setNachname(String nachname)
	{
		this.nachname = nachname;
	}

	public String getRechnungsadresse()
	{
		return rechnungsadresse;
	}

	public void setRechnungsadresse(String rechnungsadresse)
	{
		this.rechnungsadresse = rechnungsadresse;
	}

	public String getFirmenname()
	{
		return firmenname;
	}

	public void setFirmenname(String firmenname)
	{
		this.firmenname = firmenname;
	}

	public String getNotiz()
	{
		return notiz;
	}

	public void setNotiz(String notiz)
	{
		this.notiz = notiz;
	}

	public double getRabat()
	{
		return rabat;
	}

	public void setRabat(double rabat)
	{
		this.rabat = rabat;
	}

	public String getTelefon()
	{
		return telefon;
	}

	public void setTelefon(String telefon)
	{
		this.telefon = telefon;
	}

	public String getEmail()
	{
		return email;
	}

	public void setEmail(String email)
	{
		this.email = email;
	}

	public String getWeb()
	{
		return web;
	}

	public void setWeb(String web)
	{
		this.web = web;
	}

	public String getFax()
	{
		return fax;
	}

	public void setFax(String fax)
	{
		this.fax = fax;
	}

	public Date getGeburtstag()
	{
		return geburtstag;
	}

	public void setGeburtstag(Date geburtstag)
	{
		this.geburtstag = geburtstag;
	}

	public void setBelegungen(List<Belegung> belegungen)
	{
		this.belegungen = belegungen;
	}

	@Override
	public String toString()
	{
		return "Kunde [id=" + id + ", vorname=" + vorname + ", nachname=" + nachname + ", rechnungsadresse=" + rechnungsadresse + ", firmenname=" + firmenname
				+ ", notiz=" + notiz + ", rabat=" + rabat + ", telefon=" + telefon + ", email=" + email + ", web=" + web + ", fax=" + fax + ", geburtstag="
				+ geburtstag + ", belegungen=" + belegungen + "]";
	}

	public long getId()
	{
		return id;
	}
	
}
